Scroll to navigation

EXECVE(2) п═я┐п╨п╬п╡п╬п╢я│я┌п╡п╬ п©я─п╬пЁя─п╟п╪п╪п╦я│я┌п╟ Linux EXECVE(2)

п≤п°п╞

execve - п╡я▀п©п╬п╩п╫п╦я┌я▄ п©я─п╬пЁя─п╟п╪п╪я┐

п·п▒п≈п·п═

#include <unistd.h>

int execve(const char *filename, char *const argv[],
char *const envp[]);

п·п÷п≤п║п░п²п≤п∙

execve() п╡я▀п©п╬п╩п╫я▐п╣я┌ п©я─п╬пЁя─п╟п╪п╪я┐, п╥п╟п╢п╟п╡п╟п╣п╪я┐я▌ п╟я─пЁя┐п╪п╣п╫я┌п╬п╪ filename. п▓ filename п╢п╬п╩п╤п╫п╬ п╠я▀я┌я▄ я┐п╨п╟п╥п╟п╫п╬ п╦п╪я▐ п╢п╡п╬п╦я┤п╫п╬пЁп╬ п╦я│п©п╬п╩п╫я▐п╣п╪п╬пЁп╬ я└п╟п╧п╩п╟ п╦п╩п╦ я│я├п╣п╫п╟я─п╦п╧, п╫п╟я┤п╦п╫п╟я▌я┴п╦п╧я│я▐ я│п╬ я│я┌я─п╬п╨п╦ п╡п╦п╢п╟:


#! п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ [п╫п╣п╬п╠я▐п╥п╟я┌п╣п╩я▄п╫я▀п╣ п©п╟я─п╟п╪п╣я┌я─я▀]

п÷п╬п╢я─п╬п╠п╫п╣п╧ п╬ я│я├п╣п╫п╟я─п╦я▐я┘ п╫п╟п©п╦я│п╟п╫п╬ п╢п╟п╩п╣п╣ п╡ "п≤п╫я┌п╣я─п©я─п╣я┌п╦я─я┐п╣п╪я▀п╣ я│я├п╣п╫п╟я─п╦п╦".

argv — я█я┌п╬ п╪п╟я│я│п╦п╡ я│я┌я─п╬п╨, п©п╟я─п╟п╪п╣я┌я─п╬п╡ п╢п╩я▐ п╫п╬п╡п╬п╧ п©я─п╬пЁя─п╟п╪п╪я▀. envp — я█я┌п╬ п╪п╟я│я│п╦п╡ я│я┌я─п╬п╨ п╡ я└п╬я─п╪п╟я┌п╣ п╨п╩я▌я┤=п╥п╫п╟я┤п╣п╫п╦п╣, п╨п╬я┌п╬я─я▀п╣ п©п╣я─п╣п╢п╟я▌я┌я│я▐ п╫п╬п╡п╬п╧ п©я─п╬пЁя─п╟п╪п╪п╣ п╡ п╨п╟я┤п╣я│я┌п╡п╣ п╬п╨я─я┐п╤п╣п╫п╦я▐ (environment). п·п╠п╟ п╪п╟я│я│п╦п╡п╟ argv п╦ envp п╥п╟п╡п╣я─я┬п╟я▌я┌я│я▐ п╫я┐п╩п╣п╡я▀п╪ я┐п╨п╟п╥п╟я┌п╣п╩п╣п╪. п  п╪п╟я│я│п╦п╡я┐ п©п╟я─п╟п╪п╣я┌я─п╬п╡ п╦ п╬п╨я─я┐п╤п╣п╫п╦я▌ п╪п╬п╤п╫п╬ п╬п╠я─п╟я┌п╦я┌я▄я│я▐ п╦п╥ п╡я▀п╥я▀п╡п╟п╣п╪п╬п╧ п©я─п╬пЁя─п╟п╪п╪п╬п╧ я└я┐п╫п╨я├п╦п╦ main, п╣я│п╩п╦ п╬п╫п╟ п╬п©я─п╣п╢п╣п╩п╣п╫п╟ п╨п╟п╨:


int main(int argc, char *argv[], char *envp[])

п÷я─п╦ я┐я│п©п╣я┬п╫п╬п╪ п╡я▀п©п╬п╩п╫п╣п╫п╦п╦ execve() я┐п©я─п╟п╡п╩п╣п╫п╦п╣ п╫п╣ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐, п╟ п╨п╬п╢, п╢п╟п╫п╫я▀п╣, bss п╦ я│я┌п╣п╨ п╡я▀п╥п╡п╟п╡я┬п╣пЁп╬ п©я─п╬я├п╣я│я│п╟ п©п╣я─п╣п╥п╟п©п╦я│я▀п╡п╟я▌я┌я│я▐ п╥п╟пЁя─я┐п╤п╣п╫п╫п╬п╧ п©я─п╬пЁя─п╟п╪п╪п╬п╧.

п∙я│п╩п╦ я┌п╣п╨я┐я┴п╟я▐ п©я─п╬пЁя─п╟п╪п╪п╟ п╡я▀п©п╬п╩п╫я▐п╩п╟я│я▄ п©п╬п╢ я┐п©я─п╟п╡п╩п╣п╫п╦п╣п╪ ptrace, я┌п╬ п©п╬я│п╩п╣ я┐я│п©п╣я┬п╫п╬пЁп╬ п╡я▀п╥п╬п╡п╟ execve() п╣п╧ п©п╬я│я▀п╩п╟п╣я┌я│я▐ я│п╦пЁп╫п╟п╩ SIGTRAP.

п∙я│п╩п╦ я┐ я└п╟п╧п╩п╟ п©я─п╬пЁя─п╟п╪п╪я▀, я┐п╨п╟п╥п╟п╫п╫п╬пЁп╬ п╡ filename, я┐я│я┌п╟п╫п╬п╡п╩п╣п╫ п╠п╦я┌ set-user-ID п╦ я└п╟п╧п╩п╬п╡п╟я▐ я│п╦я│я┌п╣п╪п╟, п╡ п╨п╬я┌п╬я─п╬п╧ п╬п╫ я┘я─п╟п╫п╦я┌я│я▐, п╫п╣ я│п╪п╬п╫я┌п╦я─п╬п╡п╟п╫п╟ я│ п©п╟я─п╟п╪п╣я┌я─п╬п╪ nosuid (я└п╩п╟пЁ MS_NOSUID я┐ mount(2)), п╦ п╡я▀п╥я▀п╡п╟я▌я┴п╦п╧ п©я─п╬я├п╣я│я│ п╫п╣ п╡я▀п©п╬п╩п╫я▐п╣я┌я│я▐ п©п╬п╢ я┐п©я─п╟п╡п╩п╣п╫п╦п╣п╪ ptrace, я┌п╬ я└п╟п╨я┌п╦я┤п╣я│п╨п╦п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▐ п╡я▀п╥я▀п╡п╟я▌я┴п╣пЁп╬ п©я─п╬я├п╣я│я│п╟ п╪п╣п╫я▐п╣я┌я│я▐ п╫п╟ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п╡п╩п╟п╢п╣п╩я▄я├п╟ я└п╟п╧п╩п╟ п©я─п╬пЁя─п╟п╪п╪я▀. п╒п╬я┤п╫п╬ я┌п╟п╨п╤п╣, п╣я│п╩п╦ п╫п╟ я└п╟п╧п╩п╣ п©я─п╬пЁя─п╟п╪п╪я▀ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫ п╠п╦я┌ set-group-ID, я┌п╬ я└п╟п╨я┌п╦я┤п╣я│п╨п╦п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ пЁя─я┐п©п©я▀ п╡я▀п╥я▀п╡п╟я▌я┴п╣пЁп╬ п©я─п╬я├п╣я│я│п╟ я│я┌п╟п╫п╬п╡п╦я┌я│я▐ я─п╟п╡п╫я▀п╪ пЁя─я┐п©п©п╣, п╨п╬я┌п╬я─п╬п╧ п©я─п╦п╫п╟п╢п╩п╣п╤п╦я┌ я└п╟п╧п╩ п©я─п╬пЁя─п╟п╪п╪я▀.

п╓п╟п╨я┌п╦я┤п╣я│п╨п╦п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▐ п©я─п╬я├п╣я│я│п╟ п╨п╬п©п╦я─я┐п╣я┌я│я▐ п╡ я│п╬я┘я─п╟п╫я▒п╫п╫я▀п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▐ (set-user-ID), я┌п╟п╨п╤п╣ я└п╟п╨я┌п╦я┤п╣я│п╨п╦п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ пЁя─я┐п©п©я▀ п╨п╬п©п╦я─я┐п╣я┌я│я▐ п╡ я│п╬я┘я─п╟п╫я▒п╫п╫я▀п╧ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─ пЁя─я┐п©п©я▀ (set-group-ID). п╜я┌п╬ п╨п╬п©п╦я─п╬п╡п╟п╫п╦п╣ п╡я▀п©п╬п╩п╫я▐п╣я┌я│я▐ п©п╬я│п╩п╣ п╦п╥п╪п╣п╫п╣п╫п╦я▐ п╩я▌п╠п╬пЁп╬ я└п╟п╨я┌п╦я┤п╣я│п╨п╬пЁп╬ п╦п╢п╣п╫я┌п╦я└п╦п╨п╟я┌п╬я─п╟, п╨п╬я┌п╬я─п╬п╣ п©я─п╬п╦я│я┘п╬п╢п╦я┌ п╦п╥-п╥п╟ п╡я▀я│я┌п╟п╡п╩п╣п╫п╫я▀я┘ п╠п╦я┌ п©я─п╟п╡ set-user-ID п╦ set-group-ID.

п∙я│п╩п╦ п╦я│п©п╬п╩п╫я▐п╣п╪я▀п╧ я└п╟п╧п╩ я▐п╡п╩я▐п╣я┌я│я▐ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦-я│п╨п╬п╪п©п╬п╫п╬п╡п╟п╫п╫я▀п╪ я└п╟п╧п╩п╬п╪ п╡ я└п╬я─п╪п╟я┌п╣ a.out, я│п╬п╢п╣я─п╤п╟я┴п╦п╪ п╥п╟пЁп╩я┐я┬п╨п╦ п╢п╩я▐ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨, я┌п╬ п╡ п╫п╟я┤п╟п╩п╣ п╡я▀п©п╬п╩п╫п╣п╫п╦я▐ я█я┌п╬пЁп╬ я└п╟п╧п╩п╟ п╡я▀п╥я▀п╡п╟п╣я┌я│я▐ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦п╧ п╨п╬п╪п©п╬п╫п╬п╡я┴п╦п╨ Linux — ld.so(8), п╨п╬я┌п╬я─я▀п╧ п╥п╟пЁя─я┐п╤п╟п╣я┌ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦ п╡ п©п╟п╪я▐я┌я▄ п╦ п╨п╬п╪п©п╬п╫я┐п╣я┌ п╦я┘ я│ п╦я│п©п╬п╩п╫я▐п╣п╪я▀п╪ я└п╟п╧п╩п╬п╪.

п∙я│п╩п╦ п╦я│п©п╬п╩п╫я▐п╣п╪я▀п╧ я└п╟п╧п╩ я▐п╡п╩я▐п╣я┌я│я▐ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦-я│п╨п╬п╪п©п╬п╫п╬п╡п╟п╫п╫я▀п╪ я└п╟п╧п╩п╬п╪ п╡ я└п╬я─п╪п╟я┌п╣ ELF, я┌п╬ п╢п╩я▐ п╥п╟пЁя─я┐п╥п╨п╦ п╫п╣п╬п╠я┘п╬п╢п╦п╪я▀я┘ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨ п╦я│п©п╬п╩я▄п╥я┐п╣я┌я│я▐ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─, я┐п╨п╟п╥п╟п╫п╫я▀п╧ п╡ я│п╣пЁп╪п╣п╫я┌п╣ PT_INTERP. п■п╩я▐ п©я─п╬пЁя─п╟п╪п╪, я│п╨п╬п╪п©п╬п╫п╬п╡п╟п╫п╫я▀я┘ я│ Linux libc 5, п╬п╠я▀я┤п╫п╬ я█я┌п╬ /lib/ld-linux.so.1, п╦п╩п╦ /lib/ld-linux.so.2 — п╢п╩я▐ п©я─п╬пЁя─п╟п╪п╪, я│п╨п╬п╪п©п╬п╫п╬п╡п╟п╫п╫я▀я┘ я│ glibc 2.

п÷я─п╦ п╡я▀п╥п╬п╡п╣ execve() я│п╬я┘я─п╟п╫я▐я▌я┌я│я▐ п╡я│п╣ я│п╡п╬п╧я│я┌п╡п╟ п©я─п╬я├п╣я│я│п╟, п╥п╟ п╦я│п╨п╩я▌я┤п╣п╫п╦п╣п╪:

  • п≈п╫п╟я┤п╣п╫п╦я▐ п╬п╠я─п╟п╠п╬я┌я┤п╦п╨п╬п╡ п╡я│п╣я┘ п╥п╟я┘п╡п╟я┌я▀п╡п╟п╣п╪я▀я┘ я│п╦пЁп╫п╟п╩п╬п╡ я│п╠я─п╟я│я▀п╡п╟я▌я┌я│я▐ п╡ п╥п╫п╟я┤п╣п╫п╦я▐ п©п╬ я┐п╪п╬п╩я┤п╟п╫п╦я▌ (signal(7)).
  • п⌡я▌п╠п╬п╧ п╟п╩я▄я┌п╣я─п╫п╟я┌п╦п╡п╫я▀п╧ я│я┌п╣п╨ я│п╦пЁп╫п╟п╩п╟ п╫п╣ я│п╬я┘я─п╟п╫я▐п╣я┌я│я▐ (sigaltstack(2)).
  • п÷я─п╬п╣я├п╦я─п╬п╡п╟п╫п╦п╣ п©п╟п╪я▐я┌п╦ п╫п╣ я│п╬я┘я─п╟п╫я▐п╣я┌я│я▐ (mmap(2)).
  • п÷п╬п╢п╨п╩я▌я┤я▒п╫п╫я▀п╣ п╬п╠я┴п╦п╣ я│п╣пЁп╪п╣п╫я┌я▀ п©п╟п╪я▐я┌п╦ System V п╬я┌п╨п╩я▌я┤п╟я▌я┌я│я▐ (shmat(2)).
  • п·п╠п╩п╟я│я┌п╦ п╬п╠я┴п╣п╧ п©п╟п╪я▐я┌п╦ POSIX я│я┌п╟п╫п╬п╡я▐я┌я│я▐ п╫п╣я│п©я─п╬п╣я├п╦я─п╬п╡п╟п╫п╫я▀п╪п╦ (shm_open(3)).
  • п·я┌п╨я─я▀я┌я▀п╣ п╢п╣я│п╨я─п╦п©я┌п╬я─я▀ п╡ п╬я┤п╣я─п╣п╢п╦ я│п╬п╬п╠я┴п╣п╫п╦п╧ POSIX п╥п╟п╨я─я▀п╡п╟я▌я┌я│я▐ (mq_overview(7)).
  • п▓я│п╣ п╬я┌п╨я─я▀я┌я▀п╣ п╦п╪п╣п╫п╫я▀п╣ я│п╣п╪п╟я└п╬я─я▀ POSIX п╥п╟п╨я─я▀п╡п╟я▌я┌я│я▐ (sem_overview(7)).
  • п╒п╟п╧п╪п╣я─я▀ POSIX п╫п╣ я│п╬я┘я─п╟п╫я▐я▌я┌я│я▐ (timer_create(2)).
  • п▓я│п╣ п╬я┌п╨я─я▀я┌я▀п╣ п©п╬я┌п╬п╨п╦ п╨п╟я┌п╟п╩п╬пЁп╬п╡ (directory streams) п╥п╟п╨я─я▀п╡п╟я▌я┌я│я▐ (opendir(3)).
  • п▒п╩п╬п╨п╦я─п╬п╡п╨п╦ п©п╟п╪я▐я┌п╦ п╫п╣ я│п╬я┘я─п╟п╫я▐я▌я┌я│я▐ (mlock(2), mlockall(2)).
  • п·п╠я─п╟п╠п╬я┌я┤п╦п╨п╦ п╥п╟п╡п╣я─я┬п╣п╫п╦я▐ я─п╟п╠п╬я┌я▀ (exit handlers) п╫п╣ я│п╬я┘я─п╟п╫я▐я▌я┌я│я▐ (atexit(3), on_exit(3)).
  • п·п╨я─я┐п╤п╣п╫п╦я▐ п©п╩п╟п╡п╟я▌я┴п╣п╧ я┌п╬я┤п╨п╦ я│п╠я─п╟я│я▀п╡п╟я▌я┌я│я▐ п╡ п╫п╟я│я┌я─п╬п╧п╨п╦ п©п╬ я┐п╪п╬п╩я┤п╟п╫п╦я▌ (fenv(3)).

п▓ POSIX.1-2001 п╬п©я─п╣п╢п╣п╩я▒п╫ я│п©п╦я│п╬п╨ я│п╬я┘я─п╟п╫я▐п╣п╪я▀я┘ я│п╡п╬п╧я│я┌п╡ п©я─п╬я├п╣я│я│п╟. п║п╩п╣п╢я┐я▌я┴п╦п╣ я│п╡п╬п╧я│я┌п╡п╟ п©я─п╬я├п╣я│я│п╟, п╦п╪п╣я▌я┴п╦п╣я│я▐ я┌п╬п╩я▄п╨п╬ п╡ Linux, я┌п╟п╨п╤п╣ п╫п╣ я│п╬я┘я─п╟п╫я▐я▌я┌я│я▐ п©я─п╦ execve():

  • пёя│я┌п╟п╫п╟п╡п╩п╦п╡п╟п╣я┌я│я▐ я└п╩п╟пЁ PR_SET_DUMPABLE (prctl(2)), п╣я│п╩п╦ п╡я▀п©п╬п╩п╫я▐п╣п╪п╟я▐ п©я─п╬пЁя─п╟п╪п╪п╟ п╫п╣ п╦п╪п╣п╣я┌ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫п╫я▀я┘ п╠п╦я┌ set-user-ID п╦п╩п╦ set-group-ID; п╡ п©я─п╬я┌п╦п╡п╫п╬п╪ я│п╩я┐я┤п╟п╣ п╬п╫ п╬я┤п╦я┴п╟п╣я┌я│я▐.
  • п╓п╩п╟пЁ PR_SET_KEEPCAPS (prctl(2)) п╬я┤п╦я┴п╟п╣я┌я│я▐.
  • п≤п╪я▐ п©я─п╬я├п╣я│я│п╟, я┐я│я┌п╟п╫п╬п╡п╩п╣п╫п╫п╬п╣ я┤п╣я─п╣п╥ prctl(2) PR_SET_NAME (п╦ п╬я┌п╬п╠я─п╟п╤п╟п╣п╪п╬п╣ ps -o comm), п╦п╥п╪п╣п╫я▐п╣я┌я│я▐ п╫п╟ п╦п╪я▐ п╫п╬п╡п╬пЁп╬ п╦я│п©п╬п╩п╫я▐п╣п╪п╬пЁп╬ я└п╟п╧п╩п╟.
  • п║п╦пЁп╫п╟п╩ п╥п╟п╡п╣я─я┬п╣п╫п╦я▐ (termination signal) я┐я│я┌п╟п╫п╟п╡п╩п╦п╡п╟п╣я┌я│я▐ п╡ SIGCHLD (clone(2)).

п╒п╟п╨п╤п╣ я│я┌п╬п╦я┌ я┐я┤п╦я┌я▀п╡п╟я┌я▄ я│п╩п╣п╢я┐я▌я┴п╣п╣:

  • п▓я│п╣ п╫п╦я┌п╦ (threads), п╬я┌п╩п╦я┤п╫я▀п╣ п╬я┌ п╡я▀п╥я▀п╡п╟я▌я┴п╣п╧, я┐п╫п╦я┤я┌п╬п╤п╟я▌я┌я│я▐ execve(). п°я▄я▌я┌п╣п╨я│я▀, я┐я│п╩п╬п╡п╫я▀п╣ п©п╣я─п╣п╪п╣п╫п╫я▀п╣ п╦ п╢я─я┐пЁп╦п╣ п╬п╠я┼п╣п╨я┌я▀ pthreads п╫п╣ я│п╬я┘я─п╟п╫я▐я▌я┌я│я▐.
  • п÷я─п╦ п╥п╟п©я┐я│п╨п╣ п©я─п╬пЁя─п╟п╪п╪я▀ п╡я▀п©п╬п╩п╫я▐п╣я┌я│я▐ я█п╨п╡п╦п╡п╟п╩п╣п╫я┌ setlocale(LC_ALL, "C").
  • п▓ POSIX.1-2001 я┐п╨п╟п╥п╟п╫п╬, я┤я┌п╬ п╢п╣п╧я│я┌п╡п╦я▐ п©п╬ п╬я┌п╫п╬я┬п╣п╫п╦я▌ п╨ п╩я▌п╠я▀п╪ п╦пЁп╫п╬я─п╦я─я┐п╣п╪я▀п╪ п╦п╩п╦ п╦п╪п╣я▌я┴п╦п╪ п╫п╟я│я┌я─п╬п╧п╨я┐ п©п╬ я┐п╪п╬п╩я┤п╟п╫п╦я▌ я│п╦пЁп╫п╟п╩п╟п╪, п╬я│я┌п╟я▌я┌я│я▐ п╫п╣п╦п╥п╪п╣п╫п╫я▀п╪п╦. п▓ POSIX.1-2001 п╣я│я┌я▄ п╬п╢п╫п╬ п╦я│п╨п╩я▌я┤п╣п╫п╦п╣: п╣я│п╩п╦ SIGCHLD п╦пЁп╫п╬я─п╦я─я┐п╣я┌я│я▐, я┌п╬ я─п╣п╟п╩п╦п╥п╟я├п╦я▐ п╪п╬п╤п╣я┌ п╬я│я┌п╟п╡п╦я┌я▄ п╬п╠я─п╟п╠п╬я┌п╨я┐ я│п╦пЁп╫п╟п╩п╟ (disposition) п╫п╣п╦п╥п╪п╣п╫п╫п╬п╧ п╦п╩п╦ п╡п╣я─п╫я┐я┌я▄ п╫п╟я│я┌я─п╬п╧п╨я┐ п©п╬ я┐п╪п╬п╩я┤п╟п╫п╦я▌; п╡ Linux п╦я│п©п╬п╩я▄п╥я┐п╣я┌я│я▐ п©п╣я─п╡п╬п╣.
  • п▓я│п╣ п╬п╤п╦п╢п╟я▌я┴п╦п╣ п╡я▀п©п╬п╩п╫п╣п╫п╦я▐ п╟я│п╦п╫я┘я─п╬п╫п╫я▀п╣ п╬п©п╣я─п╟я├п╦п╦ п╡п╡п╬п╢п╟-п╡я▀п╡п╬п╢ п╬я┌п╪п╣п╫я▐я▌я┌я│я▐ (aio_read(3), aio_write(3)).
  • п п╟п╨ п©я─п╬п╦я│я┘п╬п╢п╦я┌ п╬п╠я─п╟п╠п╬я┌п╨п╟ п╪п╟п╫п╢п╟я┌п╬п╡ (capabilities) п©я─п╦ п╡я▀п╥п╬п╡п╣ execve(), я│п╪. capabilities(7).
  • п÷п╬ я┐п╪п╬п╩я┤п╟п╫п╦я▌, я└п╟п╧п╩п╬п╡я▀п╣ п╢п╣я│п╨я─п╦п©я┌п╬я─я▀ п╬я│я┌п╟я▌я┌я│я▐ п╬я┌п╨я─я▀я┌я▀п╪п╦ п©п╬я│п╩п╣ execve(). п╓п╟п╧п╩п╬п╡я▀п╣ п╢п╣я│п╨я─п╦п©я┌п╬я─я▀, п©п╬п╪п╣я┤п╣п╫п╫я▀п╣ п╨п╟п╨ close-on-exec (п╥п╟п╨я─я▀п╡п╟я┌я▄ п©я─п╦ п╥п╟п©я┐я│п╨п╣), п╥п╟п╨я─я▀п╡п╟я▌я┌я│я▐; я│п╪. п╬п©п╦я│п╟п╫п╦п╣ FD_CLOEXEC п╡ fcntl(2). (п∙я│п╩п╦ я└п╟п╧п╩п╬п╡я▀п╧ п╢п╣я│п╨я─п╦п©я┌п╬я─ п╥п╟п╨я─я▀я┌, я█я┌п╬ п©я─п╦п╡п╬п╢п╦я┌ п╨ п╬я│п╡п╬п╠п╬п╤п╢п╣п╫п╦я▌ п╡я│п╣я┘ п╦п╪п╣я▌я┴п╦я┘я│я▐ п╠п╩п╬п╨п╦я─п╬п╡п╬п╨, п©п╬п╩я┐я┤п╣п╫п╫я▀я┘ п╫п╟ я│п╬п╬я┌п╡п╣я┌я│я┌п╡я┐я▌я┴п╦п╧ я└п╟п╧п╩ п╢п╟п╫п╫я▀п╪ п©я─п╬я├п╣я│я│п╬п╪. п÷п╬п╢я─п╬п╠п╫п╣п╧ я│п╪. fcntl(2).) п▓ POSIX.1-2001 я│п╨п╟п╥п╟п╫п╬, я┤я┌п╬ п╣я│п╩п╦ п╠я▀ я└п╟п╧п╩п╬п╡я▀п╣ п╢п╣я│п╨я─п╦п©я┌п╬я─я▀ 0, 1 п╦ 2 п╠я▀п╩п╦ п╥п╟п╨я─я▀я┌я▀ п©п╬я│п╩п╣ я┐я│п©п╣я┬п╫п╬пЁп╬ п╡я▀п╥п╬п╡п╟ execve(), п╦ п©я─п╬я├п╣я│я│ п©п╬п╩я┐я┤п╦п╩ п╠я▀ п©я─п╦п╡п╦п╩п╣пЁп╦п╦ п╦п╥-п╥п╟ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫п╫я▀я┘ п╠п╦я┌п╬п╡ set-user_ID п╦п╩п╦ set-group_ID п╫п╟ п╦я│п©п╬п╩п╫я▐п╣п╪п╬п╪ я└п╟п╧п╩п╣, я┌п╬ я│п╦я│я┌п╣п╪п╟ я│п╪п╬пЁп╩п╟ п╠я▀ п╬я┌п╨я─я▀я┌я▄ п©я─п╬п╦п╥п╡п╬п╩я▄п╫я▀п╧ я└п╟п╧п╩ п╢п╩я▐ п╨п╟п╤п╢п╬пЁп╬ п╦п╥ я█я┌п╦я┘ п╢п╣я│п╨я─п╦п©я┌п╬я─п╬п╡. п║я┤п╦я┌п╟п╣я┌я│я▐, я┤я┌п╬ п©п╣я─п╣п╫п╬я│п╦п╪п╟я▐ п©я─п╬пЁя─п╟п╪п╪п╟, я│ п©я─п╦п╡п╦п╩п╣пЁп╦я▐п╪п╦ п╦п╩п╦ п╠п╣п╥, п╫п╣ п╪п╬п╤п╣я┌ я─п╟я│я│я┤п╦я┌я▀п╡п╟я┌я▄, я┤я┌п╬ я█я┌п╦ я┌я─п╦ я└п╟п╧п╩п╬п╡я▀я┘ п╢п╣я│п╨я─п╦п©я┌п╬я─п╟ п╠я┐п╢я┐я┌ п╬я│я┌п╟п╡п╟я┌я▄я│я▐ п╥п╟п╨я─я▀я┌я▀п╪п╦ п©п╬я│п╩п╣ execve().

п≤п╫я┌п╣я─п©я─п╣я┌п╦я─я┐п╣п╪я▀п╣ я│я├п╣п╫п╟я─п╦п╦

п≤п╫я┌п╣я─п©я─п╣я┌п╦я─я┐п╣п╪я▀п╧ я│я├п╣п╫п╟я─п╦п╧ — я█я┌п╬ я┌п╣п╨я│я┌п╬п╡я▀п╧ я└п╟п╧п╩, я┐ п╨п╬я┌п╬я─п╬пЁп╬ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫ п╠п╦я┌ п╡я▀п©п╬п╩п╫п╣п╫п╦я▐ п╦ п©п╣я─п╡п╟я▐ я│я┌я─п╬п╨п╟ п╦п╪п╣п╣я┌ п╡п╦п╢:


#! п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ [п╫п╣п╬п╠я▐п╥п╟я┌п╣п╩я▄п╫я▀п╣ п©п╟я─п╟п╪п╣я┌я─я▀]

п▓ п©п╬п╩п╣ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ п╢п╬п╩п╤п╫п╬ п╠я▀я┌я▄ я┐п╨п╟п╥п╟п╫п╬ п╦п╪я▐ я└п╟п╧п╩п╟ п╥п╟п©я┐я│п╨п╟, я█я┌п╬ п╫п╣ п╦п╪я▐ я│п╟п╪п╬пЁп╬ я└п╟п╧п╩п╟ я│я├п╣п╫п╟я─п╦я▐. п∙я│п╩п╦ п╡ п╟я─пЁя┐п╪п╣п╫я┌п╣ filename п╢п╩я▐ execve() я┐п╨п╟п╥п╟п╫ п╦п╫я┌п╣я─п©я─п╣я┌п╦я─я┐п╣п╪я▀п╧ я│я├п╣п╫п╟я─п╦п╧, я┌п╬ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ п╠я┐п╢п╣я┌ п╡я▀п╥п╡п╟п╫ я│п╬ я│п╩п╣п╢я┐я▌я┴п╦п╪п╦ п©п╟я─п╟п╪п╣я┌я─п╟п╪п╦:


п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ [п╫п╣п╬п╠я▐п╥п╟я┌п╣п╩я▄п╫я▀п╧ п©п╟я─п╟п╪п╣я┌я─] п╦п╪я▐ я└п╟п╧п╩п╟ п©п╟я─п╟п╪п╣я┌я─...

пЁп╢п╣ п©п╟я─п╟п╪п╣я┌я─... — п©п╬я│п╩п╣п╢п╬п╡п╟я┌п╣п╩я▄п╫п╬я│я┌я▄ я│п╩п╬п╡, я┐п╨п╟п╥я▀п╡п╟п╣п╪я▀я┘ п╟я─пЁя┐п╪п╣п╫я┌п╬п╪ argv п╡ execve().

п▓ я├п╣п╩я▐я┘ п©п╣я─п╣п╫п╬я│п╦п╪п╬я│я┌п╦, п╫п╣п╬п╠я▐п╥п╟я┌п╣п╩я▄п╫я▀п╧ п©п╟я─п╟п╪п╣я┌я─ п╢п╬п╩п╤п╣п╫ п╠я▀я┌я▄ п╦п╩п╦ п©я┐я│я┌я▀п╪, п╦п╩п╦ п╥п╟п╢п╟п╡п╟я┌я▄я│я▐ п╬п╢п╫п╦п╪ я│п╩п╬п╡п╬п╪ (я┌.п╣., п╫п╣ п╢п╬п╩п╤п╣п╫ я│п╬п╢п╣я─п╤п╟я┌я▄ п©я─п╬п╠п╣п╩я▄п╫я▀я┘ я│п╦п╪п╡п╬п╩п╬п╡); я│п╪. п≈п░п°п∙п╖п░п²п≤п╞ п╢п╟п╩п╣п╣.

п·пЁя─п╟п╫п╦я┤п╣п╫п╦я▐ п╫п╟ я─п╟п╥п╪п╣я─ п©п╟я─п╟п╪п╣я┌я─п╬п╡ п╦ п╬п╨я─я┐п╤п╣п╫п╦я▐

п▒п╬п╩я▄я┬п╦п╫я│я┌п╡п╬ я─п╣п╟п╩п╦п╥п╟я├п╦п╧ Unix п╫п╟п╨п╩п╟п╢я▀п╡п╟п╣я┌ п╫п╣п╨п╬я┌п╬я─я▀п╣ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦я▐ п╫п╟ п©п╬п╩п╫я▀п╧ я─п╟п╥п╪п╣я─ п©п╟я─п╟п╪п╣я┌я─п╟ п╨п╬п╪п╟п╫п╢п╫п╬п╧ я│я┌я─п╬п╨п╦ (argv) п╦ п╬п╨я─я┐п╤п╣п╫п╦я▐ (envp), п╨п╬я┌п╬я─я▀п╣ п╪п╬п╤п╫п╬ п©п╣я─п╣п╢п╟я┌я▄ п╫п╬п╡п╬п╧ п©я─п╬пЁя─п╟п╪п╪п╣. POSIX.1 п©п╬п╥п╡п╬п╩я▐п╣я┌ я─п╣п╟п╩п╦п╥п╟я├п╦п╦ п╬п╠я┼я▐п╡п╦я┌я▄ я█я┌п╬ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦п╣ я┤п╣я─п╣п╥ п╨п╬п╫я│я┌п╟п╫я┌я┐ ARG_MAX (п╬п©я─п╣п╢п╣п╩я▒п╫п╫я┐я▌ п╡ <limits.h> п╦п╩п╦ п╢п╬я│я┌я┐п©п╫я┐я▌ п╡п╬ п╡я─п╣п╪я▐ п╡я▀п©п╬п╩п╫п╣п╫п╦я▐ я┤п╣я─п╣п╥ п╡я▀п╥п╬п╡ sysconf(_SC_ARG_MAX)).

п▓ я▐п╢я─п╣ Linux п╢п╬ п╡п╣я─я│п╦п╦ 2.6.23 я─п╟п╥п╪п╣я─ п©п╟п╪я▐я┌п╦, п╦я│п©п╬п╩я▄п╥я┐п╣п╪я▀п╧ п╢п╩я▐ я┘я─п╟п╫п╣п╫п╦я▐ п╬п╨я─я┐п╤п╣п╫п╦я▐ п╦ я│я┌я─п╬п╨ п©п╟я─п╟п╪п╣я┌я─п╬п╡, п╠я▀п╩ п╬пЁя─п╟п╫п╦я┤п╣п╫ 32 я│я┌я─п╟п╫п╦я├п╟п╪п╦ (п╬п©я─п╣п╢п╣п╩я▐п╩я│я▐ я▐п╢п╣я─п╫п╬п╧ п╨п╬п╫я│я┌п╟п╫я┌п╬п╧ MAX_ARG_PAGES). п²п╟ п╟я─я┘п╦я┌п╣п╨я┌я┐я─п╟я┘ я│ 4-п п╦п▒ я─п╟п╥п╪п╣я─п╬п╪ я│я┌я─п╟п╫п╦я├я▀ я█я┌п╬ п╢п╟п╡п╟п╩п╬ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫я▀п╧ я─п╟п╥п╪п╣я─ п╡ 128 п п╦п▒.

п²п╟я┤п╦п╫п╟я▐ я│ я▐п╢я─п╟ п╡п╣я─я│п╦п╦ 2.6.23, п╠п╬п╩я▄я┬п╦п╫я│я┌п╡п╬ п╟я─я┘п╦я┌п╣п╨я┌я┐я─ п©п╬п╢п╢п╣я─п╤п╦п╡п╟я▌я┌ п©я─п╣п╢п╣п╩я▄п╫я▀п╧ я─п╟п╥п╪п╣я─, п╡я▀я│я┤п╦я┌я▀п╡п╟п╣п╪я▀п╧ п╬я┌ п╪я▐пЁп╨п╬пЁп╬ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦я▐ я─п╣я│я┐я─я│п╟ RLIMIT_STACK (я│п╪. getrlimit(2)), п╨п╬я┌п╬я─я▀п╧ п╢п╣п╧я│я┌п╡я┐п╣я┌ п╡п╬ п╡я─п╣п╪я▐ п╡я▀п╥п╬п╡п╟ execve(). (п≤я│п╨п╩я▌я┤п╣п╫п╦п╣ я│п╬я│я┌п╟п╡п╩я▐я▌я┌ п╟я─я┘п╦я┌п╣п╨я┌я┐я─я▀ п╠п╣п╥ п╪п╣я┘п╟п╫п╦п╥п╪п╟ я┐п©я─п╟п╡п╩п╣п╫п╦я▐ п©п╟п╪я▐я┌я▄я▌: п╡ п╫п╦я┘ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦п╣ я─п╟я│я│я┤п╦я┌я▀п╡п╟п╣я┌я│я▐ п╨п╟п╨ п╦ п╢п╬ п╡п╣я─я│п╦п╦ 2.6.23.) п╜я┌п╬ п╦п╥п╪п╣п╫п╣п╫п╦п╣ п©п╬п╥п╡п╬п╩я▐п╣я┌ п©я─п╬пЁя─п╟п╪п╪п╟п╪ п╦п╪п╣я┌я▄ п╠п╬п╩я▄я┬п╦п╧ я│п©п╦я│п╬п╨ п©п╟я─п╟п╪п╣я┌я─п╬п╡ п╦/п╦п╩п╦ п╬п╨я─я┐п╤п╣п╫п╦я▐. п■п╩я▐ я█я┌п╦я┘ п╟я─я┘п╦я┌п╣п╨я┌я┐я─ п©п╬п╩п╫я▀п╧ я─п╟п╥п╪п╣я─ п╬пЁя─п╟п╫п╦я┤п╣п╫ п╢п╬ 1/4 я─п╟п╥я─п╣я┬я▒п╫п╫п╬пЁп╬ я─п╟п╥п╪п╣я─п╟ я│я┌п╣п╨п╟. (п²п╟п╨п╩п╟п╢я▀п╡п╟п╣п╪п╬п╣ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦п╣ п╡ 1/4 п©п╬п╥п╡п╬п╩я▐п╣я┌ п╫п╬п╡п╬п╧ п©я─п╬пЁя─п╟п╪п╪п╣ п╡я│п╣пЁп╢п╟ п╦п╪п╣я┌я▄ п╫п╣п╨п╬я┌п╬я─п╬п╣ п©я─п╬я│я┌я─п╟п╫я│я┌п╡п╬ п©п╬п╢ я│я┌п╣п╨.) п²п╟я┤п╦п╫п╟я▐ я│ Linux п╡п╣я─я│п╦п╦ 2.6.25, я▐п╢я─п╬ п╬я┌п╡п╬п╢п╦я┌ п╫п╦п╤п╫п╦п╣ 32 я│я┌я─п╟п╫п╦я├я▀ п╢п╩я▐ я█я┌п╬пЁп╬ п©я─п╣п╢п╣п╩я▄п╫п╬пЁп╬ я─п╟п╥п╪п╣я─п╟, п©п╬я█я┌п╬п╪я┐, п╢п╟п╤п╣ п╨п╬пЁп╢п╟ RLIMIT_STACK п╥п╟п╢п╟п╫ я│п╩п╦я┬п╨п╬п╪ п╫п╦п╥п╨п╬, п©я─п╦п╩п╬п╤п╣п╫п╦я▐ пЁп╟я─п╟п╫я┌п╦я─п╬п╡п╟п╫п╫п╬ п©п╬п╩я┐я┤п╟я┌, п©п╬ п╨я─п╟п╧п╫п╣п╧ п╪п╣я─п╣, я│я┌п╬п╩я▄п╨п╬ п╤п╣ п©я─п╬я│я┌я─п╟п╫я│я┌п╡п╟ п©п╬п╢ п©п╟я─п╟п╪п╣я┌я─я▀ п╦ п╬п╨я─я┐п╤п╣п╫п╦п╣, я│п╨п╬п╩я▄п╨п╬ п╠я▀ п╬п╫п╦ п©п╬п╩я┐я┤п╦п╩п╦ п©я─п╦ я─п╟п╠п╬я┌п╣ я│ Linux 2.6.23 п╦ я─п╟п╫п╣п╣. (п╜я┌п╬ пЁп╟я─п╟п╫я┌п╦я▐ п╫п╣ п╬п╠п╣я│п©п╣я┤п╦п╡п╟п╩п╟я│я▄ п╡ Linux 2.6.23 п╦ 2.6.24.) п╒п╟п╨п╤п╣, я─п╟п╥п╪п╣я─ я│я┌я─п╬п╨п╦ п╬пЁя─п╟п╫п╦я┤п╣п╫ 32 я│я┌я─п╟п╫п╦я├п╟п╪п╦ (я▐п╢п╣я─п╫п╟я▐ п╨п╬п╫я│я┌п╟п╫я┌п╟ MAX_ARG_STRLEN), п╟ п╪п╟п╨я│п╦п╪п╟п╩я▄п╫п╬п╣ я┤п╦я│п╩п╬ я│я┌я─п╬п╨ п╪п╬п╤п╣я┌ п╠я▀я┌я▄ 0x7FFFFFFF.

п▓п·п≈п▓п═п░п╘п░п∙п°п·п∙ п≈п²п░п╖п∙п²п≤п∙

п÷я─п╦ я┐я│п©п╣я┬п╫п╬п╪ п╡я▀п©п╬п╩п╫п╣п╫п╦п╦ execve() п╫п╣ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ я┐п©я─п╟п╡п╩п╣п╫п╦п╣. п▓ я│п╩я┐я┤п╟п╣ п╬я┬п╦п╠п╨п╦ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ -1, п╟ errno я┐я│я┌п╟п╫п╟п╡п╩п╦п╡п╟п╣я┌я│я▐ п╡ я│п╬п╬я┌п╡п╣я┌я│я┌п╡я┐я▌я┴п╣п╣ п╥п╫п╟я┤п╣п╫п╦п╣.

п·п╗п≤п▒п п≤

п║п╩п╦я┬п╨п╬п╪ п╠п╬п╩я▄я┬п╬п╣ п╬п╠я┴п╣п╣ п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п╠п╟п╧я┌ п╢п╩я▐ п╬п╨я─я┐п╤п╣п╫п╦я▐ (envp) п╦ я│п©п╦я│п╨п╟ п©п╟я─п╟п╪п╣я┌я─п╬п╡ (argv).
п▓ п╬п╢п╫п╬п╪ п╦п╥ п╨п╟я┌п╟п╩п╬пЁп╬п╡ п©я─п╣я└п╦п╨я│п╟ filename п╦п╩п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ п╫п╣ я─п╟п╥я─п╣я┬я▒п╫ п©п╬п╦я│п╨. (я│п╪. я┌п╟п╨п╤п╣ path_resolution(7))
п╓п╟п╧п╩ п╦п╩п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ п╫п╣ я▐п╡п╩я▐я▌я┌я│я▐ п╬п╠я▀я┤п╫я▀п╪ я└п╟п╧п╩п╬п╪.
п²п╣ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫ п╠п╦я┌ п╡я▀п©п╬п╩п╫п╣п╫п╦я▐ п╫п╟ я└п╟п╧п╩п╣ п╦п╩п╦ я│я├п╣п╫п╟я─п╦п╦ п╦п╩п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╣ ELF.
п╓п╟п╧п╩п╬п╡п╟я▐ я│п╦я│я┌п╣п╪п╟ я│п╪п╬п╫я┌п╦я─п╬п╡п╟п╫п╟ я│ noexec.
п░я─пЁя┐п╪п╣п╫я┌ filename я┐п╨п╟п╥я▀п╡п╟п╣я┌ п╥п╟ п©я─п╣п╢п╣п╩я▀ п╢п╬я│я┌я┐п©п╫п╬пЁп╬ п╟п╢я─п╣я│п╫п╬пЁп╬ п©я─п╬я│я┌я─п╟п╫я│я┌п╡п╟.
п≤я│п©п╬п╩п╫я▐п╣п╪я▀п╧ ELF-я└п╟п╧п╩ я│п╬п╢п╣я─п╤п╦я┌ п╠п╬п╩п╣п╣ п╬п╢п╫п╬пЁп╬ я│п╣пЁп╪п╣п╫я┌п╟ PT_INTERP (я┌.п╣., п╡ п╫я▒п╪ я┐п╨п╟п╥п╟п╫п╬ п╠п╬п╩п╣п╣ п╬п╢п╫п╬пЁп╬ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟).
п÷я─п╬п╦п╥п╬я┬п╩п╟ п╬я┬п╦п╠п╨п╟ п╡п╡п╬п╢п╟-п╡я▀п╡п╬п╢п╟.
п≤п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ ELF я▐п╡п╩я▐п╣я┌я│я▐ п╨п╟я┌п╟п╩п╬пЁп╬п╪.
п²п╣ я─п╟я│п©п╬п╥п╫п╟п╫ я└п╬я─п╪п╟я┌ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ ELF.
п▓п╬ п╡я─п╣п╪я▐ п╬п©я─п╣п╢п╣п╩п╣п╫п╦я▐ filename, п╦п╪п╣п╫п╦ я│я├п╣п╫п╟я─п╦я▐ п╦п╩п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ ELF п╡я│я┌я─п╣я┌п╦п╩п╬я│я▄ я│п╩п╦я┬п╨п╬п╪ п╪п╫п╬пЁп╬ я│п╦п╪п╡п╬п╩я▄п╫я▀я┘ я│я│я▀п╩п╬п╨.
п▒я▀п╩п╬ п╢п╬я│я┌п╦пЁп╫я┐я┌п╬ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦п╣ п©п╬ п╬я┌п╨я─я▀я┌я▀п╪ я└п╟п╧п╩п╬п╡я▀п╪ п╢п╣я│п╨я─п╦п©я┌п╬я─п╟п╪ п╫п╟ п©я─п╬я├п╣я│я│.
п║п╩п╦я┬п╨п╬п╪ п╢п╩п╦п╫п╫п╬п╣ п╥п╫п╟я┤п╣п╫п╦п╣ п╟я─пЁя┐п╪п╣п╫я┌п╟ filename.
п▒я▀п╩ п╢п╬я│я┌п╦пЁп╫я┐я┌ я│п╦я│я┌п╣п╪п╫я▀п╧ п╪п╟п╨я│п╦п╪я┐п╪ п╫п╟ п╬я┌п╨я─я▀я┌я▀п╣ я└п╟п╧п╩я▀.
п╓п╟п╧п╩ filename, я│я├п╣п╫п╟я─п╦п╧ п╦п╩п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ ELF п╫п╣ я│я┐я┴п╣я│я┌п╡я┐п╣я┌, п╦п╩п╦ п╫п╣ п╫п╟п╧п╢п╣п╫п╟ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╟я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟, п╫п╣п╬п╠я┘п╬п╢п╦п╪п╟я▐ п╢п╩я▐ я└п╟п╧п╩п╬п╡п╬пЁп╬ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟.
п²п╣ я─п╟я│п©п╬п╥п╫п╟п╫ я└п╬я─п╪п╟я┌ п╦я│п©п╬п╩п╫я▐п╣п╪п╬пЁп╬ я└п╟п╧п╩п╟, п╬п╫ п╫п╣ п©п╬п╢я┘п╬п╢п╦я┌ п╢п╩я▐ п╟я─я┘п╦я┌п╣п╨я┌я┐я─я▀, п╦п╩п╦ п╦п╪п╣п╣я┌ п╬я┬п╦п╠п╨п╦ п╡ я└п╬я─п╪п╟я┌п╣, п╦п╥-п╥п╟ я┤п╣пЁп╬ п╫п╣ п╪п╬п╤п╣я┌ п╠я▀я┌я▄ п╡я▀п©п╬п╩п╫п╣п╫.
п²п╣п╢п╬я│я┌п╟я┌п╬я┤п╫п╬п╣ п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п©п╟п╪я▐я┌п╦ я▐п╢я─п╟.
п п╬п╪п©п╬п╫п╣п╫я┌ п©я┐я┌п╦ п╡ filename, я│я├п╣п╫п╟я─п╦п╦ п╦п╩п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╣ ELF п╡ п╢п╣п╧я│я┌п╡п╦я┌п╣п╩я▄п╫п╬я│я┌п╦ п╫п╣ я▐п╡п╩я▐п╣я┌я│я▐ п╨п╟я┌п╟п╩п╬пЁп╬п╪.
п╓п╟п╧п╩п╬п╡п╟я▐ я│п╦я│я┌п╣п╪п╟ я│п╪п╬п╫я┌п╦я─п╬п╡п╟п╫п╟ я│ nosuid, п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄ п╫п╣ п╦п╪п╣п╣я┌ п©я─п╟п╡ я│я┐п©п╣я─п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▐, п╟ я┐ я└п╟п╧п╩п╟ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫ п╠п╦я┌ set-user-ID п╦п╩п╦ set-group-ID.
п²п╟п╢ п©я─п╬я├п╣я│я│п╬п╪ п╡я▀п©п╬п╩п╫я▐п╣я┌я│я▐ я┌я─п╟я│я│п╦я─п╬п╡п╨п╟, п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄ п╫п╣ п╦п╪п╣п╣я┌ п©я─п╟п╡ я│я┐п©п╣я─п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▐, п╟ я┐ я└п╟п╧п╩п╟ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫ п╠п╦я┌ set-user-ID п╦п╩п╦ set-group-ID.
п≤я│п©п╬п╩п╫я▐п╣п╪я▀п╧ я└п╟п╧п╩ п╠я▀п╩ п╬я┌п╨я─я▀я┌ п╫п╟ п╥п╟п©п╦я│я▄ п╬п╢п╫п╦п╪ п╦п╩п╦ п╠п╬п╩п╣п╣ п©я─п╬я├п╣я│я│п╬п╡.

п║п·п·п╒п▓п∙п╒п║п╒п▓п≤п∙ п║п╒п░п²п■п░п═п╒п░п°

SVr4, 4.3BSD, POSIX.1-2001. п▓ POSIX.1-2001 п╫п╣ п╬п©п╦я│п╟п╫п╬ п©п╬п╡п╣п╢п╣п╫п╦п╣ #!, п╫п╬ п╡ п╬я│я┌п╟п╩я▄п╫п╬п╪ я│п╬п╡п╪п╣я│я┌п╦п╪п╬я│я┌я▄ п╣я│я┌я▄.

п≈п░п°п∙п╖п░п²п≤п╞

п²п╟п╢ п©я─п╬я├п╣я│я│п╟п╪п╦ я│ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫п╫я▀п╪п╦ set-user-ID п╦ set-group-ID п╫п╣ п╪п╬п╤п╣я┌ п╡я▀п©п╬п╩п╫я▐я┌я▄я│я▐ ptrace(2).

п▓ Linux п╦пЁп╫п╬я─п╦я─я┐я▌я┌я│я▐ п╠п╦я┌я▀ set-user-ID п╦ set-group-ID п╫п╟ я└п╟п╧п╩п╟я┘ я│п╬ я│я├п╣п╫п╟я─п╦я▐п╪п╦.

п═п╣п╥я┐п╩я▄я┌п╟я┌ я─п╟п╠п╬я┌я▀ п©я─п╦ п╪п╬п╫я┌п╦я─п╬п╡п╟п╫п╦п╦ я└п╟п╧п╩п╬п╡п╬п╧ я│п╦я│я┌п╣п╪я▀ я│ п©п╟я─п╟п╪п╣я┌я─п╬п╪ nosuid я─п╟п╥п╩п╦я┤п╟п╣я┌я│я▐ п╡ я─п╟п╥п╫я▀я┘ п╡п╣я─я│п╦я▐я┘ я▐п╢я─п╟ Linux: п╫п╣п╨п╬я┌п╬я─я▀п╣ п╠я┐п╢я┐я┌ п╬я┌п╨п╟п╥я▀п╡п╟я┌я▄ п╡ п╥п╟п©я┐я│п╨п╣ п╦я│п©п╬п╩п╫я▐п╣п╪я▀я┘ я└п╟п╧п╩п╬п╡ я│ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫п╫я▀п╪п╦ п╠п╦я┌п╟п╪п╦ set-user-ID п╦ set-group-ID, п╣я│п╩п╦ я█я┌п╬ п╢п╟п╩п╬ п╠я▀ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▌ п╠п╬п╩я▄я┬п╣ п©я─п╟п╡ я┤п╣п╪ я┐п╤п╣ п╣я│я┌я▄ (п╦ п╡п╬п╥п╡я─п╟я┴п╟я┌я▄ EPERM), п╢я─я┐пЁп╦п╣ п©я─п╬я│я┌п╬ п©я─п╬п╦пЁп╫п╬я─п╦я─я┐я▌я┌ п╠п╦я┌я▀ set-user-ID п╦ set-group-ID п╦ я┐я│п©п╣я┬п╫п╬ п╡я▀п©п╬п╩п╫я▐я┌ exec().

п÷я─п╦ я┐п╨п╟п╥п╟п╫п╦п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ я│я├п╣п╫п╟я─п╦п╣п╡ п╡ #! п╪п╟п╨я│п╦п╪п╟п╩я▄п╫п╟я▐ п╢п╩п╦п╫п╟ я│я┌я─п╬п╨п╦ я─п╟п╡п╫п╟ 127 я│п╦п╪п╡п╬п╩п╬п╡.

п║п╣п╪п╟п╫я┌п╦п╨п╟ п╫п╣п╬п╠я▐п╥п╟я┌п╣п╩я▄п╫п╬пЁп╬ п©п╟я─п╟п╪п╣я┌я─п╟ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ я│я├п╣п╫п╟я─п╦п╣п╡ я─п╟п╥п╩п╦я┤п╫п╟ п╡ я─п╟п╥п╫я▀я┘ я─п╣п╟п╩п╦п╥п╟я├п╦я▐я┘. п▓ Linux, п╡я│я▐ я│я┌я─п╬п╨п╟ п©п╬я│п╩п╣ п╦п╪п╣п╫п╦ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ п©п╣я─п╣п╢п╟я▒я┌я│я▐ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─я┐ п╨п╟п╨ п╣п╢п╦п╫я▀п╧ п©п╟я─п╟п╪п╣я┌я─, п╦ я█я┌п╟ я│я┌я─п╬п╨п╟ п╪п╬п╤п╣я┌ я│п╬п╢п╣я─п╤п╟я┌я▄ п©я─п╬п╠п╣п╩я▄п╫я▀п╣ я│п╦п╪п╡п╬п╩я▀. п·п╢п╫п╟п╨п╬, я┌п╟п╨п╬п╣ п©п╬п╡п╣п╢п╣п╫п╦п╣ п╬я┌п╩п╦я┤п╟п╣я┌я│я▐ п╬я┌ п╢я─я┐пЁп╦я┘ я│п╦я│я┌п╣п╪. п²п╣п╨п╬я┌п╬я─я▀п╣ я│п╦я│я┌п╣п╪я▀ п╦я│п©п╬п╩я▄п╥я┐я▌я┌ п©п╣я─п╡я▀п╧ п©я─п╬п╠п╣п╩ п╡ п╨п╟я┤п╣я│я┌п╡п╣ п©я─п╦п╥п╫п╟п╨п╟ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п╫п╣п╬п╠я▐п╥п╟я┌п╣п╩я▄п╫п╬пЁп╬ п©п╟я─п╟п╪п╣я┌я─п╟. п▓ п╢я─я┐пЁп╦я┘ я│п╦я│я┌п╣п╪п╟я┘, п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─ я│я├п╣п╫п╟я─п╦п╣п╡ п╪п╬п╤п╣я┌ п╦п╪п╣я┌я▄ п╫п╣я│п╨п╬п╩я▄п╨п╬ п©п╟я─п╟п╪п╣я┌я─п╬п╡, п╦ п©я─п╬п╠п╣п╩я▀ п╡ п╫п╣п╬п╠я▐п╥п╟я┌п╣п╩я▄п╫п╬п╪ п©п╟я─п╟п╪п╣я┌я─п╣ п╦я│п©п╬п╩я▄п╥я┐я▌я┌я│я▐ п╢п╩я▐ п╦я┘ я─п╟п╥пЁя─п╟п╫п╦я┤п╣п╫п╦я▐.

п▓ Linux п╟я─пЁя┐п╪п╣п╫я┌ argv п╪п╬п╤п╣я┌ п╠я▀я┌я▄ п╥п╟п╢п╟п╫ п╥п╫п╟я┤п╣п╫п╦п╣п╪ NULL, я┤я┌п╬ п©я─п╦п╡п╬п╢п╦я┌ п╨ я┌п╬п╪я┐ п╤п╣ я─п╣п╥я┐п╩я▄я┌п╟я┌я┐, п╨п╟п╨ п╣я│п╩п╦ п╠я▀ я█я┌п╬я┌ п╟я─пЁя┐п╪п╣п╫я┌ я┐п╨п╟п╥я▀п╡п╟п╩ п╠я▀ п╫п╟ я│п©п╦я│п╬п╨ я│п╬п╢п╣я─п╤п╟я┴п╦п╧ п╣п╢п╦п╫я│я┌п╡п╣п╫п╫я▀п╧ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ NULL. п²п╣ п╦я│п©п╬п╩я▄п╥я┐п╧я┌п╣ п╪п╫п╦п╪я▀п╣ п©я─п╣п╦п╪я┐я┴п╣я│я┌п╡п╟ п╢п╟п╫п╫п╬пЁп╬ я│п╡п╬п╧я│я┌п╡п╟! п╜я┌п╬ п╫п╣я│я┌п╟п╫п╢п╟я─я┌п╫п╬п╣ п©п╬п╡п╣п╢п╣п╫п╦п╣ п╦ п╫п╣ п©п╣я─п╣п╫п╬я│п╦п╪п╬: п╡ п╠п╬п╩я▄я┬п╦п╫я│я┌п╡п╣ п╢я─я┐пЁп╦я┘ я│п╦я│я┌п╣п╪ Unix я█я┌п╬ п©я─п╦п╡п╬п╢п╦я┌ п╨ п╬я┬п╦п╠п╨п╣ (EFAULT).

п▓ POSIX.1-2001 я┐п╨п╟п╥п╟п╫п╬, я┤я┌п╬ п╥п╫п╟я┤п╣п╫п╦я▐, п╡п╬п╥п╡я─п╟я┴п╟п╣п╪я▀п╣ sysconf(3), п╢п╬п╩п╤п╫я▀ п╠я▀я┌я▄ п╫п╣п╦п╥п╪п╣п╫п╫я▀ п╡ я┌п╣я┤п╣п╫п╦п╦ я│я┐я┴п╣я│я┌п╡п╬п╡п╟п╫п╦я▐ п©я─п╬я├п╣я│я│п╟. п·п╢п╫п╟п╨п╬, п╫п╟я┤п╦п╫п╟я▐ я│ п╡п╣я─я│п╦п╦ Linux 2.6.23, п╣я│п╩п╦ п╦п╥п╪п╣п╫я▐п╣я┌я│я▐ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦п╣ я─п╣я│я┐я─я│п╟ RLIMIT_STACK, я┌п╬ п╥п╫п╟я┤п╣п╫п╦п╣, п╡п╬п╥п╡я─п╟я┴п╟п╣п╪п╬п╣ п╢п╩я▐ _SC_ARG_MAX, я┌п╟п╨п╤п╣ п╠я┐п╢п╣я┌ п╦п╥п╪п╣п╫п╣п╫п╬, я┤я┌п╬п╠я▀ п╬я┌я─п╟п╥п╦я┌я▄, я┤я┌п╬ п╬пЁя─п╟п╫п╦я┤п╣п╫п╦п╣ п╫п╟ п©я─п╬я│я┌я─п╟п╫я│я┌п╡п╬ п╢п╩я▐ я┘я─п╟п╫п╣п╫п╦я▐ п©п╟я─п╟п╪п╣я┌я─п╬п╡ п╨п╬п╪п╟п╫п╢п╫п╬п╧ я│я┌я─п╬п╨п╦ п╦ п╬п╨я─я┐п╤п╣п╫п╦я▐ п╠я▀п╩п╬ п╦п╥п╪п╣п╫п╣п╫п╬.

п≤я│я┌п╬я─п╦я┤п╣я│п╨п╟я▐ я│п©я─п╟п╡п╨п╟

п▓ Unix V6 я│п©п╦я│п╬п╨ п╟я─пЁя┐п╪п╣п╫я┌п╬п╡ п╡я▀п╥п╬п╡п╟ exec() п╥п╟п╨п╟п╫я┤п╦п╡п╟п╩я│я▐ 0, п╟ я│п©п╦я│п╬п╨ п╟я─пЁя┐п╪п╣п╫я┌п╬п╡ main п╥п╟п╨п╟п╫я┤п╦п╡п╟п╩я│я▐ -1. п÷п╬я█я┌п╬п╪я┐, я█я┌п╬я┌ я│п©п╦я│п╬п╨ п╟я─пЁя┐п╪п╣п╫я┌п╬п╡ п╫п╣ п╪п╬пЁ п╠я▀я┌я▄ п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫ п╫п╟п©я─я▐п╪я┐я▌ п╡ я│п╩п╣п╢я┐я▌я┴п╣п╪ п╡я▀п╥п╬п╡п╣ exec(). п²п╟я┤п╦п╫п╟я▐ я│ Unix V7 п╬п╠п╟ я│п©п╦я│п╨п╟ я│я┌п╟п╩п╦ п╬п╨п╟п╫я┤п╦п╡п╟я┌я▄я│я▐ NULL.

п÷п═п≤п°п∙п═

п■п╟п╫п╫п╟я▐ п©я─п╬пЁя─п╟п╪п╪п╟ п╥п╟п©я┐я│п╨п╟п╣я┌я│я▐ п╡я┌п╬я─п╬п╧ п©я─п╬пЁя─п╟п╪п╪п╬п╧, п©я─п╣п╢я│я┌п╟п╡п╩п╣п╫п╫п╬п╧ п╫п╦п╤п╣. п·п╫п╟ п©я─п╬я│я┌п╬ п╡я▀п╡п╬п╢п╦я┌ я│п╡п╬п╦ п©п╟я─п╟п╪п╣я┌я─я▀ п╨п╬п╪п╟п╫п╢п╫п╬п╧ я│я┌я─п╬п╨п╦ п©п╬ п╬п╢п╫п╬п╪я┐ п╫п╟ я│я┌я─п╬п╨я┐.


/* myecho.c */
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{

int j;
for (j = 0; j < argc; j++)
printf("argv[%d]: %s\n", j, argv[j]);
exit(EXIT_SUCCESS); }

п╜я┌п╟ п©я─п╬пЁя─п╟п╪п╪п╟ п╪п╬п╤п╣я┌ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄я│я▐ п╢п╩я▐ п╥п╟п©я┐я│п╨п╟ п©я─п╬пЁя─п╟п╪п╪я▀, я┤я▄я▒ п╦п╪я▐ я┐п╨п╟п╥п╟п╫п╬ п╡ п©п╟я─п╟п╪п╣я┌я─п╣ п╨п╬п╪п╟п╫п╢п╫п╬п╧ я│я┌я─п╬п╨п╦.

/* execve.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{

char *newargv[] = { NULL, "hello", "world", NULL };
char *newenviron[] = { NULL };
if (argc != 2) { fprintf(stderr, "п≤я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦п╣: %s <п╥п╟п©я┐я│п╨п╟п╣п╪я▀п╧_я└п╟п╧п╩>\n", argv[0]); exit(EXIT_FAILURE);
}
newargv[0] = argv[1];
execve(argv[1], newargv, newenviron);
perror("execve"); /* execve() п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ я┌п╬п╩я▄п╨п╬ п©я─п╦ п╬я┬п╦п╠п╨п╣ */
exit(EXIT_FAILURE); }

п°я▀ п╪п╬п╤п╣п╪ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄ п╡я┌п╬я─я┐я▌ п©я─п╬пЁя─п╟п╪п╪я┐ п╢п╩я▐ п╥п╟п©я┐я│п╨п╟ п©п╣я─п╡п╬п╧:


$ cc myecho.c -o myecho
$ cc execve.c -o execve
$ ./execve ./myecho
argv[0]: ./myecho
argv[1]: hello
argv[2]: world

п╒п╟п╨п╤п╣ п╪я▀ п╪п╬п╤п╣п╪ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄ я█я┌п╦ п©я─п╬пЁя─п╟п╪п╪я▀ п╢п╩я▐ п╢п╣п╪п╬п╫я│я┌я─п╟я├п╦п╦ п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦я▐ п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─п╟ я│я├п╣п╫п╟я─п╦п╣п╡. п■п╩я▐ я█я┌п╬пЁп╬ я│п╬п╥п╢п╟п╢п╦п╪ я│я├п╣п╫п╟я─п╦п╧, я┤п╣п╧ "п╦п╫я┌п╣я─п©я─п╣я┌п╟я┌п╬я─" я┐п╨п╟п╥я▀п╡п╟п╣я┌ п╫п╟ п╫п╟я┬я┐ п©я─п╬пЁя─п╟п╪п╪я┐ myecho:


$ cat > script.sh
#! ./myecho script-arg
^D
$ chmod +x script.sh

п╒п╣п©п╣я─я▄ п╪я▀ п╪п╬п╤п╣п╪ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄ п╫п╟я┬я┐ п©я─п╬пЁя─п╟п╪п╪я┐ п╢п╩я▐ п╥п╟п©я┐я│п╨п╟ я│я├п╣п╫п╟я─п╦я▐:


$ ./execve ./script.sh
argv[0]: ./myecho
argv[1]: script-arg
argv[2]: ./script.sh
argv[3]: hello
argv[4]: world

п║п°п·п╒п═п≤п╒п∙ п╒п░п п√п∙

chmod(2), fork(2), ptrace(2), execl(3), fexecve(3), getopt(3), credentials(7), environ(7), path_resolution(7), ld.so(8)

2010-01-06 Linux